//
//  StatusesPictureView.swift
//  SinaMicroBlog
//
//  Created by wxy on 15/9/8.
//  Copyright © 2015年 wxy. All rights reserved.
//

import UIKit
import SDWebImage

private let StatusesPictureViewCellID = "StatusesPictureViewCellID"

class StatusesPictureView: UICollectionView {
    
    // 微博数据视图模型 - 如果是新的 cell 才会设置模型
    var statusesViewModel: StatusesViewModel? {
    
        didSet {
            // 不能重写这个方法 调用这个方法会调用sizeThatFits方法 可以重写
            sizeToFit()
            
            reloadData()
        }
    }
    
    override func sizeThatFits(size: CGSize) -> CGSize {
        
        return calculatePictureViewSize()
    }
    
    
    // 根据视图模型中图片的数量计算视图的大小
    private func calculatePictureViewSize() -> CGSize {
        
        // 1.获得当前layout属性
        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        // 设置视图默认大小
        layout.itemSize = CGSize(width: StatusesPictureItemWidth, height: StatusesPictureItemWidth)
        
        // 2.根据图片数量计算大小
        let count = statusesViewModel?.thumbnailURLs?.count ?? 0
        
        // 1> 没有图
        if count == 0 {
            return CGSizeZero
        }
        
        // 2> 一张图
        if count == 1 {
            
            // TODO: - 临时返回一个大小
            var size = CGSize(width: 100, height: 100)
            
            // 判断图片是否已经被正确缓存 Key 是 URL的完整字符串
            let key = statusesViewModel?.thumbnailURLs![0].absoluteString
            
            // 如果有缓存图片 记录当前图片的大小
            if let image = SDWebImageManager.sharedManager().imageCache.imageFromMemoryCacheForKey(key) {
                
                size = image.size
            }
            
            // 单独处理过宽或者过窄的图片
            size.width = size.width < 40 ? 40 :size.width
            size.width = size.width > 300 ? 300 : size.width
            
            layout.itemSize = size
            return size
        }
        
        // 3> 四张图 2 * 2
        if count == 4 {
            
            // 配图的宽度
            let w = 2 * StatusesPictureItemWidth + StatusesCellMargin
            
            return CGSize(width: w, height: w)
        }
        
        // 4> 其它 2，3 - 5，6 - 7，8，9
        // 计算图片行数
        // 九宫格算法 row = index / numOfCol 确定几行就能确定视图的高度
        let row = CGFloat((count - 1) / Int(StatusesPictureMaxCount) + 1)
        let h = row * StatusesPictureItemWidth + (row - 1) * StatusesPictureItemMargin
        let w = StatusesPictureMaxWidth
        
        return CGSize(width: w, height: h)
    }
    

    // 构造函数的调用是底层自动转发的init() -> initWithFrame -> initWithFrame layout:
    // 默认layout 没有被初始化
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        
        super.init(frame: frame, collectionViewLayout: UICollectionViewFlowLayout())
        
        backgroundColor = UIColor.whiteColor()
        
        // 设置行和列间距
        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        layout.minimumInteritemSpacing = StatusesPictureItemMargin
        layout.minimumLineSpacing = StatusesPictureItemMargin
        
        // 指定数据源 － 让自己当自己的数据源
        // 1. 在自定义 view 中，代码逻辑相对简单，可以考虑自己充当自己的数据源
        // 2. dataSource & delegate 本身都是弱引用，自己充当自己的代理不会产生循环引用
        // 3. 除了配图视图，自定义 pickerView(省市联动的）
        dataSource = self
        // 注册重用cell
        registerClass(StatusesPictureViewCell.self, forCellWithReuseIdentifier: StatusesPictureViewCellID)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

extension StatusesPictureView: UICollectionViewDataSource {
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // 根据数组中 url 的个数 返回item的个数
        return statusesViewModel?.thumbnailURLs?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(StatusesPictureViewCellID, forIndexPath: indexPath) as! StatusesPictureViewCell
        
        // 能进入这个数据源方法 statusesViewModel thumbnailURLs 一定有值 所以可以强行解包
        cell.imageURL = statusesViewModel!.thumbnailURLs![indexPath.item]
        
        return cell
    }
}

// 自定义配图视图的cell
private class StatusesPictureViewCell: UICollectionViewCell {
    
    // 配图的url
    var imageURL: NSURL? {
        
        didSet {
            
            iconImageView.sd_setImageWithURL(imageURL)
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        addSubview(iconImageView)
        iconImageView.ff_Fill(self)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - 懒加载
    private lazy var iconImageView: UIImageView = {
        
        let iconImageView = UIImageView()
        
        // 设置填充模式 默认是fill
        iconImageView.contentMode = UIViewContentMode.ScaleAspectFill
        iconImageView.clipsToBounds = true
        return iconImageView
    }()
}
